
/* 
@title: Tile_Slider
@description: Tile Slider is a puzzle game where players move tiles to form a complete image, in this case, a picture of a gift. The gameplay involves memorizing the original picture, shuffling the tiles, and then rearranging them using directional controls to recreate the image. This game is inspired by Monish's "The Impossible Puzzle."
@author: Susman
@tags: []
@addedOn: 2023-11-30
*/

    /*

@ Title: Tile Slider
@ Author: Susman

In case you forgot the Controls
-WASD to move tiles
-I to mix tiles
-J to mute
-K can also be used to reset the tile board

Their might be errors with the bottom
right having a inviable tile. To fix run the
game again

--Inspired By monish's the impossible puzzle--

*/





const blank = "p"

//Row 1
const r1l1 = "q"
const r1l2 = "w"
const r1l3 = "e"
const r1l4 = "r"
const r1l5 = "t"
//Row 2
const r2l1 = "y"
const r2l2 = "u"
const r2l3 = "i"
const r2l4 = "o"
const r2l5 = "m"
//Row 3
const r3l1 = "a"
const r3l2 = "s"
const r3l3 = "d"
const r3l4 = "f"
const r3l5 = "g"
//Row 4
const r4l1 = "h"
const r4l2 = "j"
const r4l3 = "k"
const r4l4 = "l"
const r4l5 = "z"
//Row 5
const r5l1 = "x"
const r5l2 = "c"
const r5l3 = "v"
const r5l4 = "b"

let empty = {
  type:  bitmap`
0000000000000000
00............00
0......1.......0
0.....111......0
0......0.......0
0......0.......0
0..1...0...1...0
0.11000300011..0
0..1...0...1...0
0......0.......0
0......0.......0
0.....111......0
0......1.......0
0..............0
00............00
0000000000000000`,
  x: 4,
  y: 4
}

let done = false;

setLegend(

  [ blank, bitmap`
0L0L0L0L0L0L0L0L
L0L0L0L0L0L0L0L0
0L0L0L0L0L0L0L0L
L0L0L0L0L0L0L0L0
0L0L0L0L0L0L0L0L
L0L0L0L0L0L0L0L0
0L0L0L0L0L0L0L0L
L0L0L0L0L0L0L0L0
0L0L0L0L0L0L0L0L
L0L0L0L0L0L0L0L0
0L0L0L0L0L0L0L0L
L0L0L0L0L0L0L0L0
0L0L0L0L0L0L0L0L
L0L0L0L0L0L0L0L0
0L0L0L0L0L0L0L0L
L0L0L0L0L0L0L0L0` ],
  [ r1l1, bitmap`
0000000000000000
0000777777777770
0007777777777777
0077777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0077777777777777` ],
  [ r1l2, bitmap`
1000000000000001
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777700000000
7770000066666666
7700666666666666
7066666666666666
0066666666666666` ],
  [ r1l3, bitmap`
1000000000000001
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
0077777777777700
6007777777777006
6600777777770066
6666077777706666` ],
  [ r1l4, bitmap`
1000000000000001
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
0000000077777777
6666666600000777
6666666666660077
6666666666666607
6666666666666600` ],
  [ r1l5, bitmap`
0000000000000000
0777777777770000
7777777777777000
7777777777777700
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777700` ],
  
  [ r2l1, bitmap`
1777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777777777
0777777777000000
0777777777033333
0777777777033333
0777777777033333
0777777777033333
0777777777033333
0777777777033333
0777777777033333
1777777777033333` ],
  [ r2l2, bitmap`
0666000000066666
06000FFFFFF06666
00FFFFFFFFFF0066
FFFFFFFFFFFFFF06
FFFFFFFFFFFFFFF0
FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF
0000000000000000
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333` ],
  [ r2l3, bitmap`
6666777777776666
6666000000006666
6666066666606666
6666066666606666
0066066666606600
F00606666660600F
FF000666666000FF
0000000000000000
0666666666666660
0666666666666660
0666666666666660
0666666666666660
0666666666666660
0666666666666660
0666666666666660
0000000000000000` ],
  [ r2l4, bitmap`
6666600000006666
66660FFFFFF00066
6600FFFFFFFFFF00
60FFFFFFFFFFFFFF
0FFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF
0000000000000000
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333` ],
  [ r2l5, bitmap`
7777777777777771
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777770
0000007777777770
3333307777777770
3333307777777770
3333307777777770
3333307777777770
3333307777777770
3333307777777770
3333307777777770
3333307777777771` ],
  
  [ r3l1, bitmap`
1777777777000000
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
1777777777777703` ],
  [ r3l2, bitmap`
0000000000000000
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333` ],
  [ r3l3, bitmap`
0000000000000000
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033` ],
  [ r3l4, bitmap`
0000000000000000
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333` ],
  [ r3l5, bitmap`
0000007777777771
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777771` ],
  
  [ r4l1, bitmap`
1777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
1777777777777703` ],
  [ r4l2, bitmap`
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333` ],
  [ r4l3, bitmap`
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033` ],
  [ r4l4, bitmap`
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333` ],
  [ r4l5, bitmap`
3077777777777771
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
3077777777777770
1000000000000001` ],

  [ r5l1, bitmap`
0077777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777703
0777777777777700
0777777777777777
0777777777777777
0077777777777777
0007777777777777
0000777777777770
0000000000000000` ],
  [ r5l2, bitmap`
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
3333333333333333
0000000000000000
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
1000000000000001` ],
  [ r5l3, bitmap`
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
3306666666666033
0000000000000000
7777777777777777
7777777777777777
7777777777777777
7777777777777777
7777777777777777
1000000000000001` ],
  [ r5l4, bitmap`
3333333333333331
3333333333333330
3333333333333330
3333333333333330
3333333333333330
3333333333333330
3333333333333330
3333333333333330
3333333333333330
0000000000000000
7777777777777770
7777777777777770
7777777777777770
7777777777777770
7777777777777770
1000000000000001` ],
)

const Startup = tune`
161.29032258064515: C4-161.29032258064515 + D4^161.29032258064515 + E4^161.29032258064515 + F4^161.29032258064515,
161.29032258064515: F4/161.29032258064515,
161.29032258064515: G4/161.29032258064515,
4677.419354838709`
const finishMixEffect = tune`
2727.2727272727275: C4-2727.2727272727275,
84545.45454545456`
const EffctUp = tune`
197.3684210526316: B4~197.3684210526316 + C5~197.3684210526316 + D5~197.3684210526316 + E5~197.3684210526316 + G5~197.3684210526316,
6118.421052631579`
const EffctSide = tune`
197.3684210526316: C5~197.3684210526316 + B4~197.3684210526316 + A4~197.3684210526316 + G4~197.3684210526316 + E4~197.3684210526316,
6118.421052631579`
const Background = tune`
149.2537313432836: A4~149.2537313432836 + G4~149.2537313432836 + C4/149.2537313432836 + G5-149.2537313432836,
149.2537313432836: G4~149.2537313432836 + G5-149.2537313432836,
149.2537313432836: G4~149.2537313432836 + D5^149.2537313432836 + E5^149.2537313432836 + C4/149.2537313432836 + G5-149.2537313432836,
149.2537313432836: G4~149.2537313432836 + A4~149.2537313432836 + B4~149.2537313432836 + E5^149.2537313432836 + D5^149.2537313432836,
149.2537313432836: B4~149.2537313432836 + C5~149.2537313432836 + D5^149.2537313432836 + F5-149.2537313432836,
149.2537313432836: C5~149.2537313432836 + D5^149.2537313432836 + E4~149.2537313432836 + F4~149.2537313432836,
149.2537313432836: B4~149.2537313432836 + D5^149.2537313432836 + F4~149.2537313432836 + E4~149.2537313432836,
149.2537313432836: B4~149.2537313432836 + A4~149.2537313432836 + D5^149.2537313432836 + C4/149.2537313432836 + E4~149.2537313432836,
149.2537313432836: A4~149.2537313432836 + D5^149.2537313432836 + C5^149.2537313432836 + B4^149.2537313432836,
149.2537313432836: A4~149.2537313432836 + B4^149.2537313432836 + C5^149.2537313432836 + C4/149.2537313432836 + F5-149.2537313432836,
149.2537313432836: A4~149.2537313432836 + C5^149.2537313432836 + D5^149.2537313432836 + F5-149.2537313432836,
149.2537313432836: A4~149.2537313432836 + D5^149.2537313432836 + F5-149.2537313432836 + G5-149.2537313432836,
149.2537313432836: A4^149.2537313432836 + C5^149.2537313432836 + B4^149.2537313432836 + G4^149.2537313432836 + F4^149.2537313432836,
149.2537313432836: A4~149.2537313432836 + F4^149.2537313432836 + G5-149.2537313432836,
149.2537313432836: A4~149.2537313432836 + B4~149.2537313432836 + E4^149.2537313432836 + C4/149.2537313432836,
149.2537313432836: B4~149.2537313432836 + F4^149.2537313432836,
149.2537313432836: B4~149.2537313432836 + A4~149.2537313432836 + F4^149.2537313432836 + C4/149.2537313432836,
149.2537313432836: A4~149.2537313432836 + G4^149.2537313432836,
149.2537313432836: A4~149.2537313432836 + G4^149.2537313432836,
149.2537313432836: A4^149.2537313432836 + G4^149.2537313432836 + B4^149.2537313432836 + G5-149.2537313432836,
149.2537313432836: A4~149.2537313432836 + C5^149.2537313432836 + D5^149.2537313432836 + G5-149.2537313432836,
149.2537313432836: A4~149.2537313432836 + B4^149.2537313432836 + G5-149.2537313432836,
149.2537313432836: B4^149.2537313432836 + C5~149.2537313432836 + A4^149.2537313432836 + C4/149.2537313432836 + G5-149.2537313432836,
149.2537313432836: C5~149.2537313432836 + D5~149.2537313432836 + A4^149.2537313432836 + B4^149.2537313432836 + G5-149.2537313432836,
149.2537313432836: D5~149.2537313432836 + C5^149.2537313432836 + B4^149.2537313432836 + C4/149.2537313432836,
149.2537313432836: C5^149.2537313432836 + D5^149.2537313432836 + E5^149.2537313432836,
149.2537313432836: C5^149.2537313432836 + E5^149.2537313432836 + D5^149.2537313432836 + B4^149.2537313432836,
149.2537313432836: C5~149.2537313432836 + B4^149.2537313432836 + A4^149.2537313432836 + A5-149.2537313432836 + G5-149.2537313432836,
149.2537313432836: C5~149.2537313432836 + A4^149.2537313432836 + C4/149.2537313432836 + F5-149.2537313432836,
149.2537313432836: C5~149.2537313432836 + A4^149.2537313432836 + F5-149.2537313432836 + E5-149.2537313432836,
149.2537313432836: C5~149.2537313432836 + C4/149.2537313432836,
149.2537313432836: C5~149.2537313432836 + D5~149.2537313432836`
const playback = playTune(Background, Infinity)

const levels = [
    map`
ppppp
ppppp
ppppp
ppppp
ppppp`,
    map`
qwert
yuiom
asdfg
hjklz
xcvb.`, 
]
setMap(levels[0]);

//-------------------------------------------------------------------------Lobby------------------------------------------------------------------------------//

addText("---How to play---", { 
  x: 1,
  y: 1,
  color: color`6`
})
addText("WASD to move Tiles", { 
  x: 1,
  y: 5,
  color: color`2`
})
addText("I to mix tiles  ", { 
  x: 1,
  y: 7,
  color: color`2`
})
addText("J to mute music", { 
  x: 1,
  y: 9,
  color: color`2`
})

  addText("Press k To Start", { 
    x: 2,
    y: 13,
    color: color`6`
  })

onInput("k", () => {
  setMap(levels[1]);
  clearText()
  playTune(Startup)
})

//--------------------------------------------------------------------------Music Controls---------------------------------------------------------------------------//


onInput("j", () => {
  playback.end()
})



//-------------------------------------------------------------------------Mix Controls------------------------------------------------------------------------------//

const printWithDelay = async (directionFunction, delay) => {
  await new Promise(resolve => setTimeout(resolve, delay));
  directionFunction();
};

const upGo = () => {
  if (done) return;
  if (empty.y === 0) return;
  // get tile to top of empty
  const t = getTile(empty.x, empty.y - 1)[0];
  t.y += 1;
  empty.y -= 1;
};

const downGo = () => {
  if (done) return;
  if (empty.y === 4) return;
  // get tile to bottom of empty
  const t = getTile(empty.x, empty.y + 1)[0];
  t.y -= 1;
  empty.y += 1;
};

const rightGo = () => {
  if (done) return;
  if (empty.x === 4) return;
  // get tile to right of empty
  const t = getTile(empty.x + 1, empty.y)[0];
  t.x -= 1;
  empty.x += 1;
};

const leftGo = () => {
  if (done) return;
  if (empty.x === 0) return;
  // get tile to left of empty
  const t = getTile(empty.x - 1, empty.y)[0];
  t.x += 1;
  empty.x -= 1;
};

const directions = [upGo, downGo, rightGo, leftGo];

const loopWithDelay = async () => {
  for (let i = 0; i < 500; i++) {
    const randomDirectionIndex = Math.floor(Math.random() * directions.length);
    await printWithDelay(directions[randomDirectionIndex], 10); // 500 milliseconds (0.5 seconds)
  }
  playTune(finishMixEffect)
};

onInput("i",() => {
  loopWithDelay();
})


//-------------------------------------------------------------------------Move Controls------------------------------------------------------------------------------//



onInput("a", () => {
  if (done) return;
  if (empty.x === 0) return;
  // get tile to left of empty
  const t = getTile(empty.x - 1, empty.y)[0];
  t.x += 1;
  empty.x -= 1;
  playTune(EffctSide)
})

onInput("d", () => {
  if (done) return;
  if (empty.x === 4) return;
  // get tile to right of empty
  const t = getTile(empty.x + 1, empty.y)[0];
  t.x -= 1;
  empty.x += 1;
  playTune(EffctSide)
})

onInput("s", () => {
  if (done) return;
  if (empty.y === 4) return;
  // get tile to bottom of empty
  const t = getTile(empty.x, empty.y + 1)[0];
  t.y -= 1;
  empty.y += 1;
  playTune(EffctUp)
})

onInput("w", () => {
  if (done) return;
  if (empty.y === 0) return;
  // get tile to top of empty
  const t = getTile(empty.x, empty.y - 1)[0];
  t.y += 1;
  empty.y -= 1;
  playTune(EffctUp)
})
